//package cn.lili.elasticsearch.config;
//
//import cn.hutool.core.convert.Convert;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.http.HttpHost;
//import org.apache.http.auth.AuthScope;
//import org.apache.http.auth.UsernamePasswordCredentials;
//import org.apache.http.client.CredentialsProvider;
//import org.apache.http.conn.ConnectionKeepAliveStrategy;
//import org.apache.http.impl.client.BasicCredentialsProvider;
//import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
//import org.apache.http.impl.nio.reactor.IOReactorConfig;
//import org.elasticsearch.client.RestClient;
//import org.elasticsearch.client.RestClientBuilder;
//import org.elasticsearch.client.RestHighLevelClient;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
//
//import javax.annotation.PreDestroy;
//import java.io.IOException;
//import java.util.List;
//
///**
// * elasticsearch 配置
// *
// * @author paulG
// * @since 2020/10/13
// **/
//@Slf4j
//@Configuration
//public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
//
//    @Autowired
//    private ElasticsearchProperties elasticsearchProperties;
//
//    private RestHighLevelClient client;
//
//    @Override
//    @Bean
//    public RestHighLevelClient elasticsearchClient() {
//        String username = elasticsearchProperties.getAccount().getUsername();
//        String password = elasticsearchProperties.getAccount().getPassword();
//        final CredentialsProvider credential = createCredentialsIfNotNull(username, password);
//
//        RestClientBuilder restBuilder = createRestClientBuilderWithConfig(credential);
//
//        client = new RestHighLevelClient(restBuilder);
//        return client;
//    }
//
//    private CredentialsProvider createCredentialsIfNotNull(String username, String password) {
//        if (username == null || password == null) {
//            return null;
//        }
//        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
//        return credentialsProvider;
//    }
//
//    private RestClientBuilder createRestClientBuilderWithConfig(CredentialsProvider credentialsProvider) {
//        return RestClient
//                .builder(this.getHttpHosts())
//                .setHttpClientConfigCallback(httpClientBuilder -> configureHttpClientBuilder(httpClientBuilder, credentialsProvider))
//                .setRequestConfigCallback(requestConfigBuilder ->
//                        requestConfigBuilder
//                                .setConnectTimeout(1000)
//                                .setSocketTimeout(12 * 1000));
//    }
//
//    private HttpAsyncClientBuilder configureHttpClientBuilder(HttpAsyncClientBuilder httpClientBuilder,
//                                                              CredentialsProvider credentialsProvider) {
//        httpClientBuilder
//                .setKeepAliveStrategy(getConnectionKeepAliveStrategy())
//                .setMaxConnPerRoute(10)
//                .setDefaultIOReactorConfig(
//                        IOReactorConfig
//                                .custom()
//                                .setIoThreadCount(Runtime.getRuntime().availableProcessors())
//                                .build());
//        if (credentialsProvider != null) {
//            httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
//        }
//        return httpClientBuilder;
//    }
//
//    private HttpHost[] getHttpHosts() {
//        List<String> clusterNodes = elasticsearchProperties.getClusterNodes();
//        HttpHost[] httpHosts = new HttpHost[clusterNodes.size()];
//        for (int i = 0; i < clusterNodes.size(); i++) {
//            String[] node = clusterNodes.get(i).split(":");
//            httpHosts[i] = new HttpHost(node[0], Convert.toInt(node[1]), elasticsearchProperties.getSchema());
//        }
//        return httpHosts;
//    }
//
//    private ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy() {
//        return (response, context) -> 2 * 60 * 1000;
//    }
//
//    /**
//     * it gets called when bean instance is getting removed from the context if
//     * scope is not a prototype
//     * If there is a method named shutdown or close then spring container will try
//     * to automatically configure them as callback methods when bean is being
//     * destroyed
//     */
//    @PreDestroy
//    public void clientClose() {
//        try {
//            this.client.close();
//        } catch (IOException e) {
//            log.error("es clientClose错误", e);
//        }
//    }
//
//}
